import { EventEmitter } from './emitter'

/**
 * 状态管理器
 */
export class StateManager<T> {
    private _state: T;
    private _eventEmitter: EventEmitter;
  
    constructor(initialState: T) {
      this._state = initialState;
      this._eventEmitter = new EventEmitter();
    }
  
    /**
     * 获取当前的状态值
     */
    public get state():T {
      return this._state;
    }
  
    /**
     * 更新的状态
     */
    public set state(newState: T) {
      this._state = newState;
      this._eventEmitter.emit('stateChange', this._state);
    }
  
    /**
     * 订阅状态改变时的事件（回调）
     * - 一个状态发生改变时，可以订阅多个回调消息
     * - 所谓消息即以一定方式封装的回调函数
     * - 所有回调消息将在状态变化时依次发出（执行回调）
     * - 依次执行的顺序也就是订阅消息的顺序
     * @param callback 状态改变后订阅的回调函数
     */
    public subscribe(callback: (state: T) => void): this {
      this._eventEmitter.addListener('stateChange', callback);
      return this;
    }
  
    /**
     * 取消订阅的回调事件
     * @param callback 要退订的回调函数
     */
    public unsubscribe(callback: (state: T) => void): this {
      this._eventEmitter.removeListener('stateChange', callback);
      return this
    }
  }
  
  